﻿using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Store.Models.Database;
using System.Security.Claims;
using Store.Models;
using Microsoft.AspNetCore.Authorization;

namespace Store.Controllers
{
    [Route("[action].html")]
    [Route("[controller]/[action]")]
    public class HomeController : Controller
    {
        private readonly Store_2022Context _db;
        //构造注入
        //在构造方法 获取对象
        public HomeController(Store_2022Context db)
        {
            _db = db;
        }

        public IActionResult Index()
        {
            return View();
        }
        public IActionResult MarKet(int cateId)
        {
            //1、查询 分类数据
            //          上下文.表名.操作
            var cates = _db.Categories.ToList();
            //2、传递 分类数据
            //     参数的名字    参数的值
            ViewData["Cates"] = cates;
             //当没有选中分类时  取第一个分类
            if(cateId==0)
            {
                //第一个分类的Id
                cateId = cates.FirstOrDefault().Id;
            }
            //查询商品数据
            var goods = _db.Goods.Where(x => x.CateId == cateId).ToList();
            //传递商品数据
            ViewData["Goods"] = goods;
            ViewData["CateId"] = cateId;

            return View();
        }
        public IActionResult Detail(int id)
            {
                //查询数据
                //查询商品 一个商品 查询条件（使用Id查询）
                var good = _db.Goods.FirstOrDefault(x => x.Id == id);
                //传递数据
                //      参数的名字   参数的值
                ViewData["Good"] = good;
                return View();
        }
        public IActionResult About()
        {
            return View();
        }
        /// 授权标签 
        [Authorize]
        public IActionResult Userinfo()
        {
            //HttpContext.User.Claims 登录信息的列表 查询单个         条件Type==ClaimTypes.NameIdentifier  用户Id
            var data = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier).Value;
            //获取授权中的用户Id
            //转换成int
            var userId = Convert.ToInt32(data);
            //在数据库查询用户数据
            var user = _db.Users.FirstOrDefault(x => x.UserId == userId);
            //传递数据
            ViewData["User"] = user;
            //购物车数据查询
            //登录用户的 购物车 商品数据（商品图片 价格 名称 购物车数量）
            var list = _db.Cars.Where(x => x.Uid == userId).Join(_db.Goods, x => x.GoodId, y => y.Id,
                (x, y) => new CarModel
                {
                    Count = x.Count,
                    Name = y.Name,
                    Cover = y.Cover,
                    Price = y.Price,
                    Id = y.Id
                }).ToList();

            //传递数据到视图
            ViewData["Cars"] = list;
            return View();
        }
        [Route("/Register.html")]
        public IActionResult Register()
        {
            return View();
        }
        //地址 接收数据
        //加一个控制器方法 进行注册逻辑
        //3、业务逻辑 注册 登录
        /// <summary>
        /// 注册方法
        /// </summary>
        /// <returns></returns>
        ///                                         接收前端传过来数据
        public IActionResult RegisterAccount(RegisterAccountRequest request)
        {
            //不能用户名重复
            // 判断数据库有无相同的账户
            if (_db.Users.Any(x => x.UserName == request.UserName))
                return Content("用户名已存在");
            //  控制器 (数据)
            //  添加一个新用户 添加一个新的用户记录
            var user = new User
            {
                UserName = request.UserName,
                Password = request.Password,
                CraeteTime = DateTime.Now,
                Photo = "",
            };
            //上下文.表名.操作方法
            _db.Users.Add(user);
            //保存更改
            var row = _db.SaveChanges();
            if (row > 0)
                return Content("注册成功");
            return Content("注册失败");
        }

        [Route("/Login.html")]
        public IActionResult Login()
        {
            return View();
        }


        /// <summary>
        /// 登录方法 登录业务逻辑
        /// </summary>
        /// <returns></returns>
        //                                   接收前端传过来
        public IActionResult LoginAccount(LoginAccountRequest request)
        {
            //  获取到了账号密码
            //  1、使用账号 查询用户 一个用户 条件 输入的用户名=数据库的
            var user = _db.Users.FirstOrDefault(x => x.UserName == request.UserName);
            if (user == null)
                return Content("用户不存在");
            //  如果存在 判断密码是否正确 
            if (user.Password == request.Password)
            {
                //存在的话 走登录流程
                //把登录信息 打包       登录信息的列表
                var claims = new List<Claim>
                {
                    //登录信息   数据的名字                登录用户的用户Id     
                    new Claim(ClaimTypes.NameIdentifier,user.UserId.ToString()),
                    //登录信息                  //登录用户的账号
                    new Claim(ClaimTypes.Name, user.UserName),
                    //登录信息                         //登录用户的头像
                    new Claim(ClaimTypes.Thumbprint, user.Photo),
                    new Claim("QQ", ""),
                };
                //把登录信息写进去HTTP上下文 写入登录状态
                HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme)));
                return Content("登录成功");
            }
            return Content("密码不正确");
        }
        /// <summary>
        /// 退出登录
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult LoginOut()
        {
            //清除登陆状态
            HttpContext.SignOutAsync();

            //跳转到首页
            return Redirect("/Index.html");
        }
        //加入购物车 需求
        //用户点击 加入购物车 按钮
        //点击事件 请求后端方法 发送数据（） 后端执行加入逻辑
        //逻辑
        //两种情况
        //1.用户 这个商品已经在购物车
        //       把记录查询(用户的该商品)出来 数量+1 更新记录
        //2、没在购物车
        //       创建一个新的购物车记录
        //       输入 Id(自增不管) 商品Id（来自前端交互） 用户Id（登录信息获取） 数量（默认1） 时间（当前时间）
        /// <summary>
        /// 加入购物车
        /// </summary>
        /// <returns></returns>
        [Authorize]
        public IActionResult AddCar(AddCarRequest request)
        {
            // 两种情况
            //1、用户 这个商品已经在购物车
            //       把记录查询(用户的该商品)出来 数量+1 更新记录
            //2、没在购物车
            //       创建一个新的购物车记录
            //       输入 Id(自增不管) 商品Id（来自前端交互） 用户Id（登录信息获取） 数量（默认1） 时间（当前时间）
            var data = HttpContext.User.Claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier).Value;
            //获取授权中的用户Id
            //转换成int
            var uId = Convert.ToInt32(data);
            //查询登录用户的该商品的购物车记录
            var record = _db.Cars.FirstOrDefault(x => x.Uid == uId && x.GoodId == request.GoodId);
            if (record != null)
            {
                record.Count += 1;
                _db.Cars.Update(record);
            }
            else
            {
                record = new Car
                {
                    GoodId = request.GoodId,
                    Uid = uId,
                    Count = 1,
                    CreateTime = DateTime.Now,
                };
                _db.Cars.Add(record);
            }
            var row = _db.SaveChanges();
            if (row > 0)
                return Content("加入成功");
            return Content("加入失败");

        }
    }
}
